/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package wservice;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.PathParam;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.FormParam;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import modelo.Produto;
import modelo.ProdutoDAO;

/**
 * REST Web Service
 *
 * @author fabio
 */
@Path("produtos")
public class ProdutoResource {

    @Context
    private UriInfo context;
    
    private EntityManagerFactory emf;

    /** Creates a new instance of ProdutoResource */
    public ProdutoResource() {
        emf = Persistence.createEntityManagerFactory("ProjetoWSDL");
    }
    
    @PUT
    @Consumes("application/xml")
    @Produces("text/html")
    public Response adicionar(Produto p) {
        try {
            ProdutoDAO dao = new ProdutoDAO(emf);            
            dao.create(p);
            return Response.ok("Produto " + p.getCodigo() + " adicionado com sucesso!").build();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Não foi possível inserir o produto - Código já existe");
            return Response.status(Response.Status.NOT_FOUND).build();
        }
    }

    /**
     * Retrieves representation of an instance of wservice.ProdutoResource
     * @return an instance of java.lang.String
     */    
    @GET
    @Produces("application/xml,text/html")
    @Path("{id}")
    public Response consultar(@PathParam("id") int id) {
        ProdutoDAO dao = new ProdutoDAO(emf);
        Produto p = dao.findProduto(id);
        if (p == null)
            return Response.ok("Não foi possível encontrar o produto " + id,"text/html").build();
        else{
            String xml = "<produto>"
                    + "<codigo>"+p.getCodigo()+"</codigo>"
                    + "<descricao>"+p.getDescricao()+"</descricao>"
                    + "<valor>"+p.getValor()+"</valor>"
                    + "<estoque>"+p.getEstoque()+"</estoque>"
                    + "</produto>";
            return Response.ok(xml,"application/xml").build();
        }
    }

    /**
     * PUT method for updating or creating an instance of ProdutoResource
     * @param content representation for the resource
     * @return an HTTP response with content of the updated or created resource.
     */
    @POST
    @Produces("text/html")
    public Response atualizar(@FormParam("produto") int id, @FormParam("descricao") String desc,
            @FormParam("preco") float preco, @FormParam("estoque") int estoq) {
        
        ProdutoDAO dao = new ProdutoDAO(emf);
        Produto produto = dao.findProduto(id);

        try {
            if (produto != null) {
                produto.setDescricao(desc);
                produto.setEstoque(estoq);
                produto.setValor(preco);
                dao.edit(produto);
                return Response.ok("Produto " + id + " editado com sucesso!").build();
            } else{
                return Response.status(Response.Status.NOT_FOUND).build();
            }
        } catch (Exception ex) {
            Logger.getLogger(ProdutoResource.class.getName()).log(Level.SEVERE, null, ex);
            return Response.status(Response.Status.NOT_FOUND).build();
        }
    }
    
    @DELETE
    @Produces("text/html")
    @Path("{id}")
    public Response deletar(@PathParam("id") int id) {
        ProdutoDAO dao = new ProdutoDAO(emf);
        try {
            dao.destroy(id);
            return Response.ok("Produto " + id + " excluido com sucesso!").build();
        } catch (Exception ex) {
            Logger.getLogger(ProdutoResource.class.getName()).log(Level.SEVERE, null, ex);
            return Response.status(Response.Status.NOT_FOUND).build();
        }
    }
}
